//package com.bsj.media.media.packageFlv;
//
//import com.alibaba.fastjson.JSON;
//import com.bsj.command.RocketMqCommand;
//import com.bsj.common.bytes.HexStr;
//import com.bsj.util.CommandDownType;
//import com.bsj.util.ExceptionUtil;
//import com.bsj.videoService.jdbc.VideoOperateRecordUtil;
//import com.bsj.videoService.msgQueue.VideoCmdProducer;
//import com.bsj.videoService.msgQueue.VideoInfoNoticeProducer;
//import com.bsj.videoService.requestType.CmdReqString;
//import com.bsj.videoService.requestType.PacketCmdBody;
//import com.bsj.videoService.requestType.VideoInfoNoticeVO;
//import com.bsj.videoServices.redis.playControl2;
//import io.netty.channel.Channel;
//import io.netty.channel.ChannelFuture;
//import io.netty.channel.ChannelFutureListener;
//import io.netty.handler.codec.http.LastHttpContent;
//import org.apache.log4j.Logger;
//
//import java.util.UUID;
//
///**
// * @Description flv文件下载流
// * @Date 2022/10/31 19:38
// **/
//public class FlvFileDownloadStream extends FlvStream {
//
//    /**
//     * 视频结束时间戳
//     */
//    public long endTimeStamps;
//    /**
//     * 最近一次接收数据时间
//     */
//    public long lastRecDataTime;
//    /**
//     * 获取文件结束标志
//     */
//    public boolean isFileEnd;
//    /**
//     * 命令链路操作的前端对应token
//     */
//    private String token;
//    /**
//     * 设备号
//     */
//    private String device;
//    /**
//     * 通道号
//     */
//    private int chn;
//    /**
//     * 用户名
//     */
//    private String userName;
//    /**
//     * 协议类型
//     */
//    private int protocol;
//    /**
//     * 持续时长(秒)
//     */
//    public int duration;
//    public FlvFileDownloadStream(String videoType, String uri, Channel sockChn, boolean isHttp, int duration, long endTime,
//                                 String token, String device, int chn, String userName, int protocol) {
//        super(videoType, uri, sockChn, isHttp, 0, protocol);
//        logger.info("uri:" + uri + "初始化！！！！");
//        // 时间加上时区8小时
//        this.endTimeStamps = endTime + 28800;
//        this.lastRecDataTime = System.currentTimeMillis();
//        this.token = token;
//        this.device = device;
//        this.chn = chn;
//        this.userName = userName;
//        this.protocol = protocol;
//        this.duration = duration;
//    }
//
//    @Override
//    public int PacketData(byte[] fd, int offset, int len, byte[] dstBuffer) {
//        this.lastRecDataTime = System.currentTimeMillis();
//        return super.PacketData(fd, offset, len, dstBuffer);
//    }
//
//    /**
//     * 判断视频帧时间是否超过请求时间段
//     * @param endJudgeType: 结束判断标识, true: 根据帧数判断  false: 根据回放时间戳进行判断
//     */
//    public void checkEnd(boolean endJudgeType) {
//        if (endJudgeType) {
//            long diff = videoFrameNum - (typeHandler.videoFrameRate * duration); // 实际帧数 - (帧率 * 持续时长)
//            if (typeHandler.videoFrameRate > 0 && duration > 0 && diff >=0 && !isFileEnd) {
//                logger.info(getUri() + " 实际接收帧数:" + videoFrameNum + ", 设备帧率:" + typeHandler.videoFrameRate + ", 持续时长:" + duration);
//                this.isFileEnd = true;
//            }
//        } else {
//            //当前接受数据时间戳 - 下载结束数据时间戳>=0 表示下载结束
//            long diff =  typeHandler.videoFrameTimeStamps - this.endTimeStamps;
//            if ((diff >= 0 || diff == -28800L) && !this.isFileEnd) {
//                //如果有些设备时区不是零时区，也是北京时间，择时间小8小时
//                this.isFileEnd = true;
//            }
//        }
//    }
//    @Override
//    public boolean checkFileDownload(long currentTime, long overTime) {
//        if (currentTime - lastRecDataTime > overTime) {
//            logger.info("下载回放视频:" + getUri() + "数据传输超时,关闭连接!!, 超时=" + (overTime/1000) + "s, 最后一帧时间=" + typeHandler.videoFrameTimeStamps + ", 最后接收数据时间:" + lastRecDataTime +
//                    ", 实际接收帧数:" + videoFrameNum + ", 设备帧率:" + typeHandler.videoFrameRate + ", 持续时长:" + duration);
//            // 关闭通道
//            doEndOperation();
//            return true;
//        } else if (isFileEnd) {
//            logger.info("下载回放视频:" + getUri() + "文件传输结束,关闭通道!");
//            doEndOperation();
//            return true;
//        }
//        return false;
//    }
//
//    // 写操作记录
//    public void doEndOperation() {
//        ChannelFuture lastContentFuture = super.getSockChn().writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);
//        lastContentFuture.addListener(ChannelFutureListener.CLOSE);
//
//        // 发送GA下载完成MQ
//        VideoInfoNoticeVO videoInfoNotice = new VideoInfoNoticeVO();
//        videoInfoNotice.setDevice(device);
//        videoInfoNotice.setChannel(chn - 127);
//        videoInfoNotice.setCmdType(CommandDownType.GA_DOWNLOAD_FINISH);
//        videoInfoNotice.setClientType(1);
//        videoInfoNotice.setCodeType(CmdReqString.PROTOCOL_TYPE_FD);
//        videoInfoNotice.setInfo(token);
//
//        try {
//            VideoInfoNoticeProducer.send(JSON.toJSONString(videoInfoNotice).getBytes());
//            logger.info("视频服务GA下载完成消息通知：" + JSON.toJSONString(videoInfoNotice));
//        } catch (Exception e) {
//            logger.error(ExceptionUtil.getStackStr(e));
//            logger.info("视频服务GA下载完成消息通知：" + JSON.toJSONString(videoInfoNotice));
//        }
//
//        // // 删除记录
//        // FdCmd.delRecord(token, device, chn, CommandDownType.REDIS_TYPE_DEV_VOD);
//        // 添加下载完成操作记录
//        VideoOperateRecordUtil.doOperRecord(token, device, chn - 127, null, CommandDownType.REDIS_TYPE_DEV_VOD, 1, true,
//                true);
//
//        if (protocol == CmdReqString.PROTOCOL_TYPE_JT) {
//            //JT1078下载，需要发送关闭指令
//            byte[] body = PacketCmdBody.doGetDevVodCtrlBody(chn - 127, CmdReqString.PLAYBACK_CMD_STOP, 0, 0);
//            // 减去操作记录
//            playControl2.closeTelVodDev(token, device, chn, CommandDownType.REDIS_TYPE_DEV_VOD);
//
//            String cmdParam = HexStr.toStr(body);
//            RocketMqCommand mqSend = new RocketMqCommand(CommandDownType.DEV_VOD_MEDIA_CLOSE, cmdParam, 0, userName,
//                    UUID.randomUUID().toString().replaceAll("-", ""), device);
//
//            try {
//                VideoCmdProducer.getMqProducer().send(CmdReqString.toGatewayCmdTopic, CmdReqString.toGatewayCmdTag,
//                        JSON.toJSONString(mqSend).getBytes());
//                logger.info("设备：" + device + " 通道：" + chn + " jt视频回放转Http下载关闭回放请求：" + JSON.toJSONString(mqSend));
//            } catch (Exception e) {
//                logger.error(ExceptionUtil.getStackStr(e));
//            }
//        }
//    }
//}
